/*
 * Copyright 2012 pibonnin.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.lestr.secuel.m3ds.sauvegarde;

import org.lestr.secuel.m3ds.animations.AnimationObjets3D;
import org.lestr.secuel.m3ds.objets3D.IObjet3d;
import org.lestr.secuel.m3ds.objets3D.IApparence;
import org.lestr.secuel.m3ds.objets3D.ITriangle;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.MutationEvent;

/**
 *
 * @author pibonnin
 */
class DomObjet3d {


    public Element obtenirDOM(Document document,
                              IObjet3d objet3d) {

        Element résultat = document.createElement("objet3d");

        objet3d.obtenirEcouteurs(new EcouteurObjet3d(résultat));

        ((EventTarget) résultat).addEventListener("DOMAttrModified",
                                                  new EcouteurDom(objet3d),
                                                  false);
        
        return résultat;
        
    }// FIN Méthode obtenirDOM


    private static class EcouteurDom implements EventListener {


        private IObjet3d objet3d;


        public EcouteurDom(IObjet3d objet3d) {

            this.objet3d = objet3d;

        }// FIN Constructeur


        @Override
        public void handleEvent(Event evt) {

            MutationEvent évenement = (MutationEvent) evt;

            if (évenement.getAttrChange() == MutationEvent.MODIFICATION)
                if (évenement.getAttrName().equalsIgnoreCase("nom"))
                    objet3d.définirNom(évenement.getNewValue());
                else if (évenement.getAttrName().equalsIgnoreCase("solide"))
                    objet3d.définirSolide(évenement.getNewValue().equalsIgnoreCase("oui"));

        }// FIN Méthode handleEvent


    }// FIn Classe ImplementationEcouteurDom


    private static class EcouteurObjet3d implements IObjet3d.IEcouteur {


        private Element element;


        public EcouteurObjet3d(Element element) {

            this.element = element;

        }// FIN Constructeur


        @Override
        public void nomChangé(IObjet3d objet,
                              String ancienNom) {

            element.setAttribute("nom", objet.obtenirNom());

        }// FIN Méthode nomChangé


        @Override
        public void formeChangée(IObjet3d objet) {
        }// FIN Méthode formeChangée


        @Override
        public void triangleAjouté(IObjet3d objet,
                                   ITriangle triangle) {
        }// FIN Méthode triangleAjouté


        @Override
        public void triangleRetiré(IObjet3d objet,
                                   ITriangle triangle) {
        }// FIN Méthode triangleRetiré


        @Override
        public void textureChangée(IObjet3d objet,
                                   IApparence texture) {
        }// FIN Méthode textureChangée


        @Override
        public void transparenceChangée(IObjet3d objet,
                                        int ancienneTransparence) {
        }// FIN Méthode transparenceChangée


        @Override
        public void réflexionChangée(IObjet3d objet,
                                     int ancienneRéfexion) {
        }// FIN Méthode réflexionChangée


        @Override
        public void animationAjoutée(IObjet3d objet,
                                     AnimationObjets3D animation) {
        }// FIN Méthode animationAjoutée


        @Override
        public void animationRetirée(IObjet3d objet,
                                     AnimationObjets3D animation) {
        }// FIN Méthode animationRetirée


        @Override
        public void lu(IObjet3d objet) {
        }// FIN Méthode lu


        @Override
        public void arrêté(IObjet3d objet) {
        }// FIN Méthode arrêté


    }


}// FIN Classe DomObjet3d
